/*
 * 公用JS库
 * @author 蔡源
 * @since 2006-9-28
 */


/**
 * document.getElementById()的简写
 */
function $() 
{ 
  var elements = new Array(); 
  for (var i = 0; i < arguments.length; i++) 
  { 
    var element = arguments[i]; 
    if (typeof element == 'string') 
    {
    	if (document.getElementById) {    
			element = document.getElementById(element);    
		} else if (document.all) {   
			element = document.all[element];    
		} else if (document.layers) {    
			element = document.layers[element];    
		}  
    }    
    if (arguments.length == 1) 
      return element; 
    elements.push(element); 
  } 
  return elements; 
}


/************************************
	String类扩展 START
*************************************/
/**
 * String类去空格的原生对象
 */
String.prototype.trim = function (){	
	return this.replace(/(^\s*)|(\s*$)/g, "");		
}

/**
 * String类去左空格的原生对象
 */
String.prototype.ltrim = function (){	
	return this.replace(/(^\s*)/g, "");		
}

/**
 * String类去右空格的原生对象
 */
String.prototype.ltrim = function (){	
	return this.replace(/(\s*$)/g, "");		
}


/**
 * 验证字符串是否为NULL或空
 */
String.prototype.isEmpty = function()
{
	if(this.trim()=="")
		return true;
	else
		return false;	
}

/**
 * 获取字符串长度，中文算2个
 */
String.prototype.ansiLength = function()
{
	var len = 0;
	for (i = 0; i < this.length; i++)
	{
		if (this.charCodeAt(i) > 127)
			len = len + 2;
		else
			len++;
	}
	return len;	
} 

/**
 * 全文字符串替换
 */
String.prototype.replaceAll = function(toReplace,replacement){
  return this.replace(new RegExp(toReplace,"gm"),replacement);
}



/**
 * String类去HTML编码的原生对象
 */
String.prototype.escapeHTML = function (){	
	if(this.isEmpty())
    {
        return "";
    } 
    else
    {
	   var content = this;	 
	       
	   //Stripts the <script> tags from the html
	   var scriptregex = "<script[^>.]*>[sS]*?</script>";
	   var scripts = new RegExp(scriptregex, "gim");
	   content = content.replace(scripts, "");
	
	   //Stripts the <style> tags from the html
	   var styleregex = "<style[^>.]*>[sS]*?</style>";
	   var styles = new RegExp(styleregex , "gim");
	   content = content.replace(styles, "");
	
	   //Strips the HTML tags from the html
	   var objRegExp = new RegExp("<(.| )+?>", "gim");
	   content = content.replace(objRegExp, "");
	   
       return content;
    }		
}

/**
 * XML对HTML的转码
 */
String.prototype.encodeXML=function()
{
	var str=this;
	str=str.replace(/\x26/g,"&#38;");
	str=str.replace(/\x3c/g,"&#60;");
	str=str.replace(/\x3e/g,"&#62;");
	str=str.replace(/\x22/g,"&#34;");
	str=str.replace(/\x27/g,"&#39;");
	str=str.replace(/\x20/g,"&#160;");
	return str;
}
 
/************************************
	String类扩展 END
*************************************/ 
 
/********************* jsMap *****************************/

/**
 * javascript的Map对象
 */
function jsMap() {
  this.map = new Array();  
} 

/**
 * map结构
 * @param key 关键字
 * @param value 值
 */ 
function jsMap_struct(key, value){
  this.key = key;
  this.value = value;
}

/**
 * 插入一个新值
 */
jsMap.prototype.put = function(key, value){  
  for (var i = 0; i < this.map.length; i++)
  {
    if ( this.map[i].key === key )
    {
      this.map[i].value = value;
      return;
    }
  }  
  this.map[this.map.length] = new jsMap_struct(key, value);
}

/**
 * 根据主键查找
 */
jsMap.prototype.get = function(key)
{
  for (var i = 0; i < this.map.length; i++)
  {
    if ( this.map[i].key == key )
    {
      return this.map[i].value;
    }
  }  
  return null;
}

/**
 * 根据主键删除
 */
jsMap.prototype.remove = function(key)
{
  var v;
  for (var i = 0; i < this.map.length; i++)
  {
    v = this.map.pop();
    if ( v.key == key )
      continue;
      
    this.map.unshift(v);
  }
}

/**
 * 获得jsMap对象大小
 */
jsMap.prototype.size = function(){
  return this.map.length;
}

/**
 * jsMap是否为空
 */
jsMap.prototype.isEmpty = function(){
  return this.map.length <= 0;
}
/********************* jsMap *****************************/



/**
 * 设置浏览器状态栏信息
 */
function setStatus(txt)
{
	window.status=txt;
}

/**
 * 设置浏览器状态栏信息(框架页中子页面使用)
 */
function setParentStatus(txt)
{
	parent.frames.window.status=txt;
	parent.frames.document.title=txt;
}

/**
 * 设置页面标题导航栏
 */
function setTitle(parentLocation,title)
{
	var parent = parentLocation.toString().replace(/,/g," → ");	
	
	document.write("<table class=\"maintitle\"><tr><td class=\"userLocation\">");
	document.write("<span class='mainimg'>&nbsp;</span>&nbsp;&nbsp;");
	document.write("您现在所在的位置是:");
	document.write(parent);
	document.write("&nbsp;→&nbsp;<font style='font-weight:bold;'>");
	document.write(title);
	document.write("</font></td></tr><tr><td class=\"mainline\"></td></tr></table>");
	var status = "您现在所在的位置是:"+parent+" → "+title;
	setStatus(status);
}

/**
 * 表格形式的分隔线
 * @param width 宽度
 * @param height 高度
 * @param bgcolor 线条颜色
 */
function tabline(width,height,bgcolor)
{
	document.write("<table  bgcolor=\"" + bgcolor + "\" width=\""+ width + "\" height=\"" + height + "\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
	document.write("<tr><td></td></tr></table>");
}

/**
 * 增强型文本区域,可通过上下箭头设置区域大小
 * @param fieldId 文本区域ID
 * @param num_r 一次伸缩区域的行数
 */
function textAreaEx(fieldId, num_r){ 
	document.write("<span onclick=\"javascript:$('"+fieldId+ "').rows+= " + num_r + ";\" title=\"拉长\" style=\"cursor:hand\">");
	document.write("<img src=\"images/down.gif\" border=\"0\"></span>");
	document.write("&nbsp;&nbsp;<span onclick=\"javascript:if($('"+fieldId+ "').rows != "+ num_r + "){$('"+fieldId+ "').rows-="+ num_r +";}else{$('"+fieldId+ "').rows="+ num_r +";}\" title=\"缩短\" style=\"cursor:hand\">");
	document.write("<img src=\"images/up.gif\" border=\"0\"></span>");
}

/**
 * 自动调整IFRAME的高度
 * @param iframeId iframe的ID
 */
function autoIframe(iframeId)
{
  var iframe = $(iframeId);
  iframe.height = iframe.document.body.scrollHeight;   
}  

/**
 * 弹出窗口
 * 
 * @param _url 显示内容链接
 * @param _title 窗口标题
 * @param _width 窗口宽度
 * @param _height 窗口高度
 * @param _top 窗口距顶边距离
 * @param _left 窗口距左边距离
 */
function openPop(_url,_title,_width,_height,_top,_left)
{	
	//window.open(url,'popWin',"width=" + w + ",height=" + h + ",top=" + t + ",left=" + l + ",resizable=1,menubar=no,status=no,scrollbars=yes");
		var win = new Ext.Window({
               title : _title,
               body:  new Ext.ux.ManagedIFrame({autoCreate:{ src:_url, frameBorder: 0}}),
               layout:'fit',
               width:_width,
               height:_height, 
               maximizable : true,
               shim :false,   
               closeAction : 'close',     
               modal :true,      
               plain: true                        
   		});
    	win.show(); 
    	return win;
}

function openWin(_url,_title,_width,_height,_top,_left)
{	
	var obj=window.open(_url,'popWin',"width=" + _width + ",height=" + _height + ",top=" + _top + ",left=" + _left + ",resizable=1,menubar=no,status=no,scrollbars=yes");
	return obj;
}

/**
 * 打印本页的链接地址
 */
function copyUrl()
{
	document.write(self.location);
}

/**
 * 禁用页面所有按钮
 */
function disableAllBtn(flag)
{
	var objs = document.getElementsByTagName("button");
	if(objs==null)
		return;
	for(var i=0;i<objs.length;i++)
	{		
		if(flag!=null&&flag==true)
			objs[i].disabled = true;
		else
			objs[i].disabled = false;	
	}	
}

/**
 * 显示等待进度条
 * @param divId 等待进度条div的ID
 * @param flag 是否显示标志
 */
function showWait(divId,flag) {
	var DHTML = (document.getElementById || document.all || document.layers);   
	if (!DHTML) return;  
	var obj = $(divId);
	if(obj==null)
		return; 
	var x = obj.style;    
	x.display = (flag) ? 'block':'none'    
	if(! document.getElementById) 
	{  
		if(document.layers) {  
			x.left=280/2;  
		}  
	} 	
	return true;    
}

/**
 * 全选指定多选下拉框
 * @param field 多选select的表单对象
 */
function selectAllSelect(field)
{
	if(field == null)
		return;
		
	for(i = 0; i < field.length; i++)
		field[i].selected = true;
}
 

/**
 * 全选/反选指定复选框
 * @param field checkbox的表单对象
 */
function selectAllBox(field)
{
	
	if(field == null)
		return;
	var iCount = checkedCount(field);
	var i;

	if(field.length == null)
	{
		field.checked = iCount < 1;
		return;
	}
	for(i = 0; i < field.length; i++)
		field[i].checked = iCount < field.length;
}

/**
 * 验证是否选择的复选框
 * @param field checkbox的表单对象
 * @param name checkbox的表单对象的含义
 */
function sl_checkBox(field,name)
{	
	if(field == null)
	{
		sl_alert("无可选项！");	
		return false;
	}

	if(field.length == null)
	{
		
		if(field.checked)
			return true;
		else
		{
			sl_alert("请选择'" + name + "'！");	
			return false;
		}
	}
	for(i=0;i<field.length;i++) 
	{
		if(field[i].checked)
		{
			return true;
		}	
	}
	sl_alert("请选择'" + name + "'！");	
	return false;
}

/**
 * 统计复选框被选中的个数
 * @param field checkbox的表单对象
 */
function checkedCount(field)
{
	var iCount = 0;
	var i;
	
	if(field == null)
		return 0;
		
	if(field.length == null)
	{
		if(field.checked)
			return 1;
		else
			return 0;
	}

	for(i = 0; i < field.length; i++)
		if(field[i].checked)
			iCount++;

	return iCount;
}

/**
 * 获得复选框被选中的一个或多个元素的值,用逗号分割
 * @param field checkbox的表单对象 
 */
function getCheckBoxValues(field)
{
	var ret = "";
	if(field == null)
		return "";

	if(field.length == null)
	{		
		if(field.checked)
			return field.value;
		else
			return "";
	}

	for(i = 0; i < field.length; i++)
		if(field[i].checked)
			ret=ret+field[i].value+",";
	var point = ret.lastIndexOf(",");		
	if(point>0)
		ret = ret.substring(0,point);

	return ret;
}

/**
 * 获得单选框组中选中的值
 * @param fieldName 单选框表单对象的名称
 * @since 2006-10-10 caiyuan
 */
function getRadioValue(fieldName)
{	
	var field = document.getElementsByName(fieldName);
	
	for(i=0;i<field.length;i++) 
	{
		if(field[i].checked)
		{			
			return field[i].value;
		}	
	}	
	return null;
}

/**
 * 验证下拉框必须
 * @param field 下拉框表单对象
 * @param name 下拉框表单对象名称
 */
function sl_checkChoice(field, name)
{
	if (field.value == null || field.value == "")
	{
		sl_alert("请选择'" + name + "'！");
		field.focus();
		return false;
	}
	return true;
}

/**
 * 系统确认信息框
 * @param confirm_info 确认信息
 */
function sl_confirm(confirm_info)
{
	return confirm("系统确认：\n\n您确认要" + confirm_info + "吗？");
}

/**
 * 系统确认继续信息框
 * @param confirm_info 确认继续信息
 */
function sl_continue(continue_info)
{
	return confirm("系统确认：\n\n" + continue_info + "，您确认要继续吗？");
}


/**
 * 系统警告提示框
 * @param errinfo 错误信息 
 * @param url 出错后的跳转页面(可空) 
 */
function sl_alert(errinfo, url)
{
	alert("系统提示：　　　　\n\n" + errinfo + "\n\n");
	if (url != null)
		location.replace(url);
}

/**
 * 保存成功的系统提示框
 * @param url 成功后的跳转页面(可空) 
 */
function sl_update_ok(url)
{
	sl_alert("保存成功！",url);
}

/**
 * 删除成功的系统提示框
 * @param url 成功后的跳转页面(可空) 
 */
function sl_remove_ok(url)
{
	sl_alert("删除成功！",url);
}

/**
 * 去左右空格方法
 * @param string 传入的值
 */
function trim(string)
{
	return string.replace(/(^\s*)|(\s*$)/g, "");	
}


/**
 * 封装了对BUFFALO回调函数返回结果的处理 - 适用于当前页面的操作
 * 
 * @param ret 返回信息为业务错误信息
 * @param info 系统提示信息
 * @param refreshType 页面刷新类型
 * @param url 当页面需要跳转时的URL
 * 
 */
function ajaxSubmit(ret,info,refreshType,url)
{ 	
    if(ret!=null&&ret!="")
    {
		sl_alert(ret);	
	}
	else
	{
		if(info!=null&&info!="")
		{
			sl_alert(info);	//系统提示信息
		}	
		if(refreshType=="reload")
			location.reload();	
		else if(refreshType=="close")	
		{
			window.returnValue = true;	
			window.close();
		}			
		else if(refreshType=="location")	
			location = url;
		else if(refreshType=="back")		
			history.back();//由于使用AJAX页面未刷新，故可以调用这个方法返回前一页	
	}	
}

/**
 * 封装了对BUFFALO回调函数返回结果的处理 - 适用于当前页面的操作
 * 返回信息为有用信息，需要手工做处理，所以这里不处理
 * @param info 系统提示信息
 * @param refreshType 页面刷新类型
 * @param url 当页面需要跳转时的URL
 */
function ajaxSubmitNone(info,refreshType,url)
{ 	
	if(info!=null&&info!="")
		sl_alert(info);
	if(refreshType=="reload")
		location.reload();	
	else if(refreshType=="close")	
		window.close();	
	else if(refreshType=="location")	
		location = url;	
	else if(refreshType=="back")	
		history.back();		
}

/** 
 * DWR异常处理绑定
 * @param errorString 异常信息的内容
 * @param exception 异常类型
 */
function dwrErrorHandler(errorString, exception) 
{ 
	sl_alert(errorString); 	
}

/**
 * 按回车的时候将焦点切换到下一个表单控件
 * @param field 当前焦点控件
 * @param forceNext 是否强制切换
 */
function nextKeyPress(field, forceNext)
{
	if (event.keyCode == 13 || forceNext)
	{
		event.keyCode = 9;
		return true;
	}
}

/**
 * 下拉框形式的跳转页面
 * @param targ 目标框架
 * @param selObj 下拉框对象
 */
function selectJumpPage(targ,selObj)
{ 
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");  
}


/**
 * 16进制转换10进制
 * @param string 需要转换的字符串
 * @since 2005-12-23  
 */
function convert16To10(string)
{
	if(string == null||string =="")
	{		
		return "";
	}	
	else
		return parseInt("0x"+string,16);
}

/**
 * 10进制转换16进制
 * @param string 需要转换的字符串
 * @since 2005-12-23  
 */
function convert10To16(string)
{
	if(string == null||string =="")
		return "";
	else	
		return parseInt(string).toString(16);
}


/**
 * 获得两个日期相差天数
 * @param beginDate 开始日期(整型)
 * @param endDate 结束日期(整型)
 */
function getBetweenDays(beginDate, endDate)
{
	var sdate = new Date(beginDate.replace(/-/g,"\/"));
	var edate = new Date(endDate.replace(/-/g,"\/"));
	var n = (edate.getTime()-sdate.getTime())/(24*60*60*1000);
	return n;
}

/**
 * TRUE/FALSE的转换
 */
function switchBoolean(flag)
{
	if(flag)
		return false;
	else
		return true;	
}

/**
 * 数据类型转换(布尔型)
 * @param value 传入值,可以是"true"或"false"的字符串,或是"1或"0"的字符串
 * @since 2006-10-10
 */
function sl_parseBoolean(value)
{
	if(value==null)
		return null;
	else if(value=="true"||value=="1")
		return true;
	else if(value=="false"||value=="0")	
		return false;	
}

/**
 * 数据类型转换(浮点型)
 * @param value 传入值,可以是用逗号分隔的金额型
 */
function sl_parseFloat(value)
{
	var s = "";
	for (var i = 0; i < value.length; i++)
	{
		if (value.charAt(i) != ',')
			s = s + value.charAt(i)
	}
	if (s == "")
		return 0;
	else
		return parseFloat(s);
}

/**
 * 按ESC的时候关闭窗口，可用在弹出窗口或系统退出
 */
function chachEsc(nKeyCode)
{
	if (27 == nKeyCode)
	{		
		window.opener = null;
		window.close();
	}
}

/**
 * 切换页面元素可见或不可见
 * @param element 页面元素
 */
function invertVisible(element)
{
	if(element.style.display == "")
		element.style.display = "none";
	else
		element.style.display = "";
}

/**
 * 将原列表中选中的项加入目标列表
 * @param sourceObj 原列表对象
 * @param targetObj 目标列表对象
 * @param isAllFlag 是否全部添加
 */		 
function moveLeftRight(sourceObj,targetObj,isAllFlag)
{		 	
	var sourceCount = sourceObj.length;	//原列表的长度
	if(sourceCount<=0)
	{
		sl_alert("已无可移动的项目！");
		return false;
	}	
	var sortArray = new Array();	//将需要变动的列表暂存，用以保持左右两边的排序
	for(i=sourceObj.length-1;i>=0;i--)
	{
		var option = sourceObj.options(i);
		if(option.selected||isAllFlag)
		{
			var oOption = document.createElement("OPTION");
			oOption.text= option.text;
			oOption.value= option.value;		 			
 			sortArray.push(oOption);
			sourceObj.remove(i);		
 		}
 	}
 	//将暂存的OPTION队列插入目标列表
 	for(i=sortArray.length-1;i>=0;i--)
 	{
 		targetObj.add(sortArray[i]);
 	}
}

/**
 * 菜单选择框的项目上移或下移
 * @param element 表单对象 
 * @param moveFlag 移动标志(up：上，down：下)
 */
function moveUpDown(element,moveFlag)
{
 	var count = element.length;
   	if(count<=1)
   		return false;
   		
   	if(moveFlag=="up")	//上移	
   	{
    	for(i=1;i<count;i++)
    	{
    		var oOption = element[i];
    		if(oOption.selected)
    		{
    			oOption.swapNode(element[i-1]);
    		}	
    	}
   	}
   	else
   	{
   		for(i=count-2;i>=0;i--)
    	{
    		var oOption = element[i];
    		if(oOption.selected)
    		{
    			oOption.swapNode(element[i+1]);
    		}	
    	}
   	}	
}


/**
 * 从原目标列表中取出被选中的加入右边
 * TODO: 已整合成moveMutiChoose一个方法，该方法作废
 */
function moveOne(source,target)
{
	var sourceOptionLen = source.options.length;	
	
	var sourceOption;	
	for(i=0;i<sourceOptionLen; i++)
	{
		sourceOption = source.options(i);
		if(sourceOption.selected)
		{
			var targetOption = document.createElement("OPTION");
			target.options.add(targetOption);
			targetOption.innerText = sourceOption.innerText;
			targetOption.value = sourceOption.value;									
		}
	}
	for(i = sourceOptionLen - 1; i >= 0; i--)
	{
		sourceOption = source.options(i);
		if(sourceOption.selected)
		{
			removeOptions(source,i);
		}	
	}	
}

/**
 * 从原目标列表中取出被选中的加入右边
 * TODO: 已整合成moveMutiChoose一个方法，该方法作废
 */
function moveAll(source,target)
{
	var sourceOptionLen = source.options.length;	
	
	var sourceOption;	
	for(i=0;i<sourceOptionLen; i++)
	{
		sourceOption = source.options(i);
		var targetOption = document.createElement("OPTION");
		target.options.add(targetOption);
		targetOption.innerText = sourceOption.innerText;
		targetOption.value = sourceOption.value;
	}
	for(i = sourceOptionLen - 1; i >= 0; i--)
	{
		sourceOption = source.options(i);
		removeOptions(source,i);		
	}	
}

/**
 * 移除指定索引号的选项
 * @param element 下拉列表对象
 * @param index 索引号
 * 
 */
function removeOptions(element,index)
{	
	element.options.remove(index);
}

/**
 * 将内容中的HTML代码编码
 * @param content 内容
 * @return
 */
function htmlEncoder(content)
{
    if(isEmpty(content))
    {
        return "";
    } 
    else
    {
	    var objRegExp = null;
	    
	    objRegExp = new RegExp("<", "g");
   		content =  content.replace(objRegExp, "&lt;"); 
  		objRegExp = new RegExp(">", "g");
   		content =  content.replace(objRegExp, "&gt;"); 
   		objRegExp = new RegExp("\"", "g");
   		content =  content.replace(objRegExp, "&quot;"); 
   		objRegExp = new RegExp("'", "g");
   		content =  content.replace(objRegExp, "&#039;"); 
   		objRegExp = new RegExp(" ", "g");
   		content =  content.replace(objRegExp, "&nbsp;"); 
   		objRegExp = new RegExp("\r\n", "g");
   		content =  content.replace(objRegExp, "<br/>"); 
   		objRegExp = new RegExp("\r", "g");
   		content =  content.replace(objRegExp, "<br/>"); 
   		objRegExp = new RegExp("\n", "g");
   		content =  content.replace(objRegExp, "<br/>");	 
   		content = "<p>"+content+"</p>";
        return content;
    }
}

/**
 * 图片自适应大小
 * @param _image 图片对象 
 * @param max_width	最大允许宽度 
 * @param max_height 最大允许高度
 */
function resizeImage(_image, max_width, max_height) {
    var _width = _image.width;	//图片实际宽度    
    var _height = _image.height;	//图片实际高度
    var width_ratio = _width / max_width;	//最大允许宽度和图片实际宽度的比例    
    var height_ratio = _height / max_height;	//最大允许高度和图片实际高度的比例

    if ( width_ratio >= height_ratio && _image.width > max_width) {
        _image.width = max_width;//如果宽度的比例大,表示实际宽度大,所以直接限定图片宽度,高度会随之自动调整        
    }
    else if (height_ratio > width_ratio && _image.height > max_height) {
        _image.height = max_height;	//高度比例大,限定图片高度        
    }
}

/**
 * 重绘页面图片大小，宽度超过600的图片一律缩小到600
 */
function resizeImages()
{
	try
	{
		var images = document.getElementsByTagName("IMG");		
		for (i=0;i<images.length;i++)
		{
			if(images[i].offsetWidth>600)	//这里判断需要对那些图片做处理
			{				
				resizeImage(images[i],600,500);
				//images[i].onmousewheel = function ()	//暂时取消滚轮控制图象大小功能
				//{
					//var zoom = parseInt(this.style.zoom, 10)||100; 					
					//zoom += event.wheelDelta/12; 
					//if (zoom<20) zoom=20; //只允许缩小到20% 
					//if (zoom>300) zoom=300; //只允许放大到300% 					
 					//this.style.zoom=zoom+'%'; 
   					//return false; 					
				//}
			}	
		}
	}
	catch(e)
	{
		sl_alert(e.description);
	}
}

/**
 * 动态加载CSS（未完善）
 * @param href css文件链接路径
 * @since 2007-8-16 
 * 
 */
function dynamicCss(href)
{	
    var cssTag = document.getElementById('loadCss');
    var head = document.getElementsByTagName('head').item(0);
    if(cssTag) head.removeChild(cssTag);
    css = document.createElement('link');
    css.href = href;
    css.rel = 'stylesheet';
    css.type = 'text/css';
    //css.id = 'loadCss';
    head.appendChild(css);
}

